package com.dhcc.bpm.modules.scf.util;

import org.springframework.stereotype.Component;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * 单位换算工具类
 */
@Component
public class UnitConverter {

    // 将输入值转换为 BigDecimal 类型的辅助方法
    private static BigDecimal convertToBigDecimal(Object value) {
        // 如果输入值是 Double、Integer 或 Float 类型，则创建相应的 BigDecimal 对象
        if (value instanceof Double || value instanceof Integer || value instanceof Float) {
            return BigDecimal.valueOf(((Number) value).doubleValue());
        }
        // 如果输入值是 BigDecimal 类型，则直接返回
        else if (value instanceof BigDecimal) {
            return (BigDecimal) value;
        }
        // 如果输入值是 String 类型，则尝试将其解析为 BigDecimal 对象
        else if (value instanceof String) {
            try {
                return new BigDecimal((String) value);
            } catch (NumberFormatException e) {
                throw new IllegalArgumentException("单位换算转换异常！");
            }
        }
        // 如果输入值不是数值类型，则抛出异常
        else {
            throw new IllegalArgumentException("单位换算转换异常！");
        }
    }

    /**
     * KG转万吨
     *
     * @param value 输入的数值，可以是 Double、Integer、Float、BigDecimal 或 String 类型的数值
     * @return 返回对应的万吨值，以 BigDecimal 类型返回，四舍五入保留两位小数
     * @throws IllegalArgumentException 如果输入值不是数值类型或无法解析为数值类型
     */
    public BigDecimal convertToMetricTons(Object value) {
        // 将输入值转换为 BigDecimal 类型，确保处理各种数值类型
        BigDecimal inputBigDecimal = convertToBigDecimal(value);

        // 将 BigDecimal 类型的千克转换为万吨，使用 setScale 设置小数位数并指定舍入模式为 RoundingMode.HALF_UP
        return inputBigDecimal.divide(BigDecimal.valueOf(1000), 2, RoundingMode.HALF_UP);
    }
}